/*
 * Copyright (C), 2013, 上海汽车集团股份有限公司
 * FileName: DataSourceContext.java
 * Author:   12010065
 * Date:     2013年10月9日 下午2:03:55
 * Description: //模块目的、功能描述
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.ibm.framework.dal.util;

import java.util.Stack;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * 数据源上下文<br>
 * 基于线程局部变量及栈实现
 * 
 * @author 12010065
 * 
 */
public class DataSourceContext {
    /**
     * 日志
     */
    private static Logger logger = LoggerFactory.getLogger(DataSourceContext.class);

    /**
     * 事务上下文
     */
    private static ThreadLocal<Stack<DataSource>> transcationContext = new ThreadLocal<Stack<DataSource>>();

    /**
     * 获取数据源
     * 
     * @return 数据源
     */
    public static DataSource getDataSource() {
        DataSource dataSource = null;
        /** 数据源入栈 */
        Stack<DataSource> stack = getStack();
        if (!stack.empty()) {
            dataSource = stack.peek();
        }

        logger.debug("get currentThread datasource : " + dataSource);
        return dataSource;
    }

    /**
     * 将当前数据源推入栈
     * 
     * @param dataSource 数据源
     */
    public static void pushCurrentDataSource(DataSource dataSource) {
        Stack<DataSource> stack = getStack();
        stack.push(dataSource);
        logger.debug("bind currentThread datasource : " + dataSource.toString());
    }

    /**
     * 当前数据源从栈中取出
     */
    public static void popCurrentDataSource() {
        Stack<DataSource> stack = getStack();
        if (!stack.empty()) {
            logger.debug("release currentThread datasource : " + stack.pop());
        }
    }

    /**
     * 数据源容器
     * 
     * @return 数据源堆栈
     */
    private static Stack<DataSource> getStack() {
        if (transcationContext.get() == null) {
            transcationContext.set(new Stack<DataSource>());
        }
        return transcationContext.get();
    }
}
